/**
 * 合适的单位
 * @author 木人心
 * @version 2.0.0
 */
import dataset from './dataset'
import { NumberUtil } from '@/utils/object-util'

// TODO 创建字典
// 字典
const dictionary: Record<string, number[]> = {}
dataset.forEach((item, i) => {
  item.unitList.forEach((item2, j) => {
    dictionary[item2.unit] = [i, j]
  })
})

const verifyValue = {
  valueLen (value: number, option: MatchUnitFnLenStrOption) {
    const val = NumberUtil.toFixed(value, option.fractionDigits)
    if (!option.containsSymbol) {
      return delSymbol(val) <= option.desiredLen
    }
    return val.toString().length <= option.desiredLen
  },
  maxCarry (value: number, option: MatchUnitFnMaxNumberOption) {
    return value < option.carryNumber
  }
}

/**
 * 通过提高单位缩短数据长度
 * @param value 数据
 * @param unit 当前单位
 * @param type
 * @param option
 */
export const matchUnit: MatchUnitFnType = (value, unit, type, option) => {
  const ret = { value: NumberUtil.toFixed(value, option.fractionDigits), unit }
  // 如果合法，返回当前值
  if (verifyValue[type](value, option)) {
    return ret
  } else {
    // 获取对应单位的配置
    const dicIds = dictionary[unit]
    // 如果找不到返回原值
    if (dicIds) {
      // 获取单位列表和基准值
      const units = dataset[dicIds[0]].unitList
      const baseVal = value * units[dicIds[1]].ratio
      // 遍历比对哪一个单位合法
      for (let i = dicIds[1] + 1; i < units.length; i++) {
        const val = Number((baseVal / units[i].ratio).toFixed(option.fractionDigits))
        ret.value = val
        ret.unit = units[i].unit
        if (verifyValue[type](val, option)) break
      }
      return ret
    } else {
      return ret
    }
  }
}
// 验证value是否合规
// function verifyValue (value: number) {
//   const val = NumberUtil.toFixed(value, fractionDigits)
//   if (!containsSymbol) {
//     return delSymbol(val) <= desiredLen
//   }
//   return val.toString().length <= desiredLen
// }

// 删除符号
function delSymbol (arg: number) {
  return arg.toString().split('').filter(item => !isNaN(Number(item))).length
}

// export const matchUnit = (value: number, unit: string, desiredLen: number, fractionDigits: number, containsSymbol = false) => {
//   const ret = {
//     value: NumberUtil.toFixed(value, fractionDigits),
//     unit
//   }
//   // 如果合法，返回当前值
//   if (verifyValue(value)) {
//     return ret
//   } else {
//     // 获取对应单位的配置
//     const dicIds = dictionary[unit]
//     // 如果找不到返回原值
//     if (dicIds) {
//       // 获取单位列表和基准值
//       const units = dataset[dicIds[0]].unitList
//       const baseVal = value * units[dicIds[1]].ratio
//       // 遍历比对哪一个单位合法
//       for (let i = dicIds[1] + 1; i < units.length; i++) {
//         const val = Number((baseVal / units[i].ratio).toFixed(fractionDigits))
//         ret.value = val
//         ret.unit = units[i].unit
//         if (verifyValue(val)) break
//       }
//       return ret
//     } else {
//       return ret
//     }
//   }
//
//   // 验证value是否合规
//   function verifyValue (value: number) {
//     const val = NumberUtil.toFixed(value, fractionDigits)
//     if (!containsSymbol) {
//       return delSymbol(val) <= desiredLen
//     }
//     return val.toString().length <= desiredLen
//   }
//
//   // 删除符号
//   function delSymbol (arg: number) {
//     return arg.toString().split('').filter(item => !isNaN(Number(item))).length
//   }
// }
